class: inverse,left, middle background-image: url(data:image/png;base64,#background.png) background-size: cover <img src="data:image/png;base64,#LOGO_DIPLOMADO.png" width="500px"/> ##Módulo 5: Manejo de datos climáticos avanzados ### Introducción a las Series de tiempo MatÃas Olea <br> <a href="https://orcid.org/0000-0003-0194-7784"> ORCID </a><br> matias.olea@pucv.cl</a><br> .large[<b><a href="https://www.pucv.cl/uuaa/site/edic/base/port/labgrs.html">LabGRS</a> | Noviembre 2023</b>] <br> --- class: center,middle background-image: url(data:image/png;base64,#labgrs_logo.png) background-size: 35% --- ## Contenidos .pull-left[ 1) Que es una serie de tiempo. 2) Extracción de series de tiempo (vector) desde raster temporales. 3) Remuestreo temporal. 4) Componentes de una serie y descomposición. 5) Tendencia de MannKendall 6) Análisis de cambios en tendencias (ciclos). 7) AnomalÃas respecto a desviaciones de la media (Z-score). ] .pull-right[ <img src="data:image/png;base64,#https://raw.githubusercontent.com/allisonhorst/stats-illustrations/main/rstats-artwork/r_rollercoaster.png" width="650px"/> ] --- ### Series de tiempo Una **serie de tiempo** corresponde a un conjunto de observaciones de variables cuantitativas en el tiempo. Estas variables pueden o no tener distintos comportamiento en el tiempo.
--- ### Series de tiempo Las series las podemos encontrar como estacionarias y no estacionarias .pull-left[ **Estacionaria**. Es aquella cuya media y varianza se mantienen en el tiempo, es decir, son constantes, por lo que facilita más su modelamiento.
] .pull-right[ **No Estacionaria**. Es aquella cuya media y varianza cambian en el tiempo, es decir, no son constantes, por lo que dificulta más su modelamiento.
] --- ### Series de tiempo Las series temporales poseen 4 componentes (3 para algunos autores) los cuales son en simples palabras: -- **Tendencia** (T - trend): corresponde al comportamiento de la media y la varianza en el tiempo. -- **Ciclos** (C - cycle): oscilaciones respecto a la tendencia en largas o medias escalas temporales. Como se desprende de la tendencia, algunos autores no la consideran como un componente propiamente tal. -- **Estacionalidad** (S - seasonality): comportamientos determinados en periodos fijos. Corresponden a cambios dentro de unidades de tiempo de manera regular (como cambios intra-anuales). -- **Aleatorio** (R - random): comportamiento sin un patrón determinado. Es un comportamiento practicamente impredecible. Lo podemos encontrar en la literatura también como "erratico". --- ### Series de tiempo <center><img src="data:image/png;base64,#raster_ts.jpg" width="1000px"/></center> --- ### Series de tiempo #### Lectura de datos ```r library(tidyverse) ``` ```r setwd("C:/TuDirectorio/") # Tu directorio de trabajo (donde tienes tus archivos) pp_valpo <- read.csv("PP_Valparaiso.csv") # transformamos la columna llamada "date" de caracter (chr) a fecha (Date) pp_valpo$date <- as.Date(pp_valpo$date) ``` --- ### Series de tiempo #### Lectura de datos <img src="data:image/png;base64,#SeriesTiempo_files/figure-html/unnamed-chunk-7-1.png" width="100%" /> --- ### Series de tiempo #### Remuestreo temporal El remuestreo temporal consiste en realizar **agregaciones** o **agrupaciones** temporales, según una condición de tiempo (mensual, anual, semestral, trimestral, etc.). Comunmente, estos ejercicios se realizan para: - Tener una **periodicidad** o **intérvalos de tiempo regulares** en nuestros datos. Ej: Caso Landsat (16-dÃas 1 satelite / 8-dÃas 2 satelites) - **Disminuir las brechas** por pérdida de datos causados por la presencia de nubes. Ej: Composites de MODIS. De datos diarios a cada 16-dias. - Homologar fuentes de información con **diferentes resoluciones temporales**. Ej: Datos de dendrocronológicos (1-año) con datos satelitales o climáticos. --- class: center,middle background-image: url(data:image/png;base64,#tiempo.png) background-size: 90% background-color: black --- ### Series de tiempo #### Remuestreo temporal Para este ejemplo, utilizaremos nuestra serie de tiempo EVI de MODIS-Aqua de 16-dÃas (23 datos al año) para remuestrearla temporalmene en datos mensuales. **Opción 1: usando tidyverse** ```r pp_valpo$month <- month(pp_valpo$date) # creamos una nueva columna con los meses pp_valpo$year <- year(pp_valpo$date) # creamos una nueva columna con los años tabla_anual <- pp_valpo %>% group_by(year) %>% # agrupamos por año y mes summarise(PP_anual = sum(PP, na.rm = T)) # agrupamos usando la suma ``` --- ### Series de tiempo #### Remuestreo temporal <img src="data:image/png;base64,#SeriesTiempo_files/figure-html/unnamed-chunk-9-1.png" width="100%" /> --- ### Series de tiempo #### Remuestreo temporal **Opción 2: usando xts** ```r library(xts) # la versión para raster es "rts" xts_PP <- xts(pp_valpo$PP, # vector numerico con la variable pp_valpo$date) # vector de fechas PP_Anual_xts <- apply.yearly(xts_PP, FUN = sum) # agregación mensual ``` --- ### Series de tiempo #### Remuestreo temporal <img src="data:image/png;base64,#SeriesTiempo_files/figure-html/unnamed-chunk-11-1.png" width="100%" /> --- ### Series de tiempo #### Test de estacionariedad ```r library("tseries") ``` **Kwiatkowski-Phillips-Schmidt-Shin (KPSS) test** **H<sub>0</sub>**: La serie de tiempo tiene una tendencia estacionaria. **H<sub>A</sub>**: La serie de tiempo tiene una tendencia no estacionaria. --- ### Series de tiempo #### Test de estacionariedad ```r kpss.test(pp_valpo$PP, null = "Trend", lshort = F) ``` ``` ## ## KPSS Test for Trend Stationarity ## ## data: pp_valpo$PP ## KPSS Trend = 0.23994, Truncation lag parameter = 19, p-value = 0.01 ``` Se rechaza H<sub>0</sub> por lo tanto la serie es **no estacionaria**. <img src="data:image/png;base64,#SeriesTiempo_files/figure-html/unnamed-chunk-14-1.png" width="100%" /> --- ### Series de tiempo #### Descomposición de la serie ```r ts_mensual <- ts(pp_valpo$PP, # vector con la variable start = c(1960, 1), # año y mes de inicio de la serie end = c(2021, 12), # año y mes de termino de la serie frequency = 12) # frecuencia de datos al año dec_PP <- decompose(ts_mensual) # descomposición ``` --- ### Series de tiempo <img src="data:image/png;base64,#SeriesTiempo_files/figure-html/unnamed-chunk-17-1.png" width="100%" /> --- ### Series de tiempo #### Test tendencia Mannkendall ```r library(Kendall) MannKendall(pp_valpo$PP) ``` ``` ## tau = -0.00991, 2-sided pvalue =0.68595 ``` --- ### Series de tiempo #### Tendencia <img src="data:image/png;base64,#SeriesTiempo_files/figure-html/unnamed-chunk-19-1.png" width="100%" /> --- ### Series de tiempo #### Análisis de cambios en tendencias (ciclos) ```r library(DBEST) ciclos <- DBEST(data = ts_mensual, # objeto clase Time-Series data.type = "cyclical", # datos con o sin componente estacional seasonality = 12, # cantidad de datos por ciclo anual algorithm = "change detection", # tipo de detección breakpoints.no = 5, # numero de breaks solicitados para encontrar first.level.shift = 0.05, # umbral principal de cambio second.level.shift = 0.1, # umbral secundario de cambio distance.threshold = "default", # busqueda de umbral si está por defecto duration = 60, # 60 meses = 5 años alpha = 0.05) # p-value ``` --- ### Series de tiempo <center><img src="data:image/png;base64,#dbest.png" width="1000px"/></center> --- ### Series de tiempo ```r ciclos$Start # [primer, segundo, tercer ... más grande] ``` ``` ## [1] 450 449 299 667 330 ``` ```r ciclos$End # [primer, segundo, tercer ... más grande] ``` ``` ## [1] 465 450 300 668 345 ``` ```r pp_valpo$date[ciclos$Start[1]] ``` ``` ## [1] "1997-06-15" ``` --- ### Series de tiempo #### Pero ... ¿qué ocurre si trabajamos a nivel anual? <img src="data:image/png;base64,#SeriesTiempo_files/figure-html/unnamed-chunk-23-1.png" width="100%" /> --- ### Series de tiempo #### AnomalÃas respecto a desviaciones de la media (Z-score) usando periodo completo ```r tabla_anual$Zscore <- scale(tabla_anual$PP_anual, scale = T) ``` ```r ggplot(tabla_anual, aes(x = year, y = Zscore, fill = I(ifelse(tabla_anual$Zscore > 0, 'blue', 'brown')), color = I(ifelse(tabla_anual$Zscore > 0, 'blue', 'brown'))))+ geom_col() + ylab("Anomalia PP") + xlab("") + theme_bw() ``` --- ### Series de tiempo #### AnomalÃas respecto a desviaciones de la media (Z-score) usando periodo completo <img src="data:image/png;base64,#SeriesTiempo_files/figure-html/unnamed-chunk-26-1.png" width="100%" /> --- ### BibliografÃa (2012) E. B. Brooks, V. A. Thomas, R. H. Wynne and J. W. Coulston, "Fitting the Multitemporal Curve: A Fourier Series Approach to the Missing Data Problem in Remote Sensing Analysis," in IEEE Transactions on Geoscience and Remote Sensing, vol. 50, no. 9, pp. 3340-3353. doi: 10.1109/TGRS.2012.2183137. (2004) Jin Chen, Per. Jönsson, Masayuki Tamura, Zhihui Gu, Bunkei Matsushita, Lars Eklundh, A simple method for reconstructing a high-quality NDVI time-series data set based on the Savitzky–Golay filter, Remote Sensing of Environment, Volume 91, Issues 3–4, (2022) Kong, D., McVicar, T. R., Xiao, M., Zhang, Y., Peña-Arancibia, J. L., Filippa, G., Xie, Y., Gu, X. phenofit: An R package for extracting vegetation phenology from time series remote sensing. Methods in Ecology and Evolution, 13, 1508– 1527. https://doi-org.pucv.idm.oclc.org/10.1111/2041-210X.13870 (2015) G. Yang, H. Shen, L. Zhang, Z. He and X. Li, "A Moving Weighted Harmonic Analysis Method for Reconstructing High-Quality SPOT VEGETATION NDVI Time-Series Data," in IEEE Transactions on Geoscience and Remote Sensing, vol. 53, no. 11, pp. 6008-6021. doi: 10.1109/TGRS.2015.2431315. --- class: inverse middle 